package org.example.basic.lambda.collectors;



import org.example.basic.entity.UserEntity;
import org.example.basic.entity.UserEntityList;

import java.util.*;
import java.util.stream.Collectors;

/**
 * Copyright (C), 2022, szw
 * FileName: CollectingAndThenTest
 *
 * @author songyafei
 * Date:     2022/1/17 13:34
 * Description: CollectingAndThen 案例
 * History:
 * <author>          <time>          <version>          <desc>
 * 作者姓名           修改时间           版本号              描述
 */
public class CollectingAndThenTest {

    public static void main(String[] args) {
        List<UserEntity> item = UserEntityList.getItem();
        /**
         * 简单案例
         */
        List<UserEntity> l1 = item.stream().collect(Collectors.collectingAndThen(Collectors.toList(),
                Collections::unmodifiableList));
        l1.forEach(System.out::println);
        System.out.println("---------------------------------------");
        /**
         * 场景1 ： 对集合中数据去重,根据userId 分组
         */
        ArrayList<UserEntity> l2 = item.stream().collect(Collectors.collectingAndThen(
                Collectors.toCollection(
                        () -> new TreeSet<>(Comparator.comparing(UserEntity::getUserId)))
                , ArrayList::new));
        l2.forEach(System.out::println);

        /**
         * 场景2： 计算平均薪资
         */
        Double dv = item.stream().collect(Collectors.collectingAndThen(
                Collectors.averagingDouble(UserEntity::getSalary), Double::doubleValue
        ));

        /**
         * 第二种方式： 除了mapToDouble外 还由 mapToInt mapToLong max min 可以灵活运用
         */
        OptionalDouble d1 = item.stream().mapToDouble(UserEntity::getSalary).average();
        System.out.println("平均："+dv);
        System.out.println("平均："+d1);


    }
}
